package com.cskaoyan.wordmemorize.controller.app;

import com.cskaoyan.wordmemorize.auth.StpKit;
import com.cskaoyan.wordmemorize.common.result.Result;
import com.cskaoyan.wordmemorize.dto.admin.PageDTO;
import com.cskaoyan.wordmemorize.dto.app.*;
import com.cskaoyan.wordmemorize.request.PageRequest;
import com.cskaoyan.wordmemorize.request.UserRemindCommand;
import com.cskaoyan.wordmemorize.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

@Tag(name = "移动端-用户(我的)模块")
@RestController
@RequestMapping("user")
public class AppUserController {

    @Resource
    private UserService userService;

    /**
     * 获取用户信息
     *
     * @return UserDTO 用户信息
     */
    @Operation(summary = "***获取用户信息",
            description = "在用户打开APP或者其他路由跳转的时候，通过token获取用户信息",
            responses = {
                    @ApiResponse(
                            responseCode = "200",
                            description = "成功. 返回登录成功的用户信息，以及当前等级权限码集合"
                    ),
                    @ApiResponse(responseCode = "500",
                            description = "请求失败"
                    )
            }
    )
    @GetMapping("/info")
    public Result<UserDTO> getUserInfo() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层方法
        UserDTO userDTO = userService.getUserInfo(userId);

        // 返回userDTO 用户信息
        return Result.ok(userDTO);
    }


    /**
     * 修改每天复习提醒时间
     *
     * @param command 每天复习提醒时间请求体
     */
    @Operation(summary = "修改每天复习提醒时间", description = "设置或修改用户每日复习提醒时间（24小时制HH:mm）")
    @PutMapping("/remind")
    public Result<Void> updateUserRemind(@RequestBody UserRemindCommand command) {
        // 请求体中已经带了userId，但并不是实际要用的id，需另行获取
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();
        userService.updateUserRemind(command, userId);

        return Result.ok();
    }


    /**
     * 修改每天复习单词数量
     *
     * @param count 每天复习单词数量
     */
    @Operation(summary = "修改每天复习单词数量", description = "设置或修改用户每日计划学习的单词数量")
    @PutMapping("/day/voc")
    public Result<Void> updateVocCountOfDay(@RequestParam Integer count) {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        userService.updateVocCountOfDay(userId, count);

        return Result.ok();
    }

    /**
     * 我的页面-用户学习信息
     *
     * @return UserPageDTO 用户在“我的”页面要展示的信息
     */
    @Operation(summary = "获取我的页面展示信息", description = "返回我的页面所需的用户规划单词量、单词上限、提醒时间等信息")
    @GetMapping("/voc/my/page")
    public Result<UserPageDTO> getUserPage() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        UserPageDTO userPageDTO = userService.getUserPage(userId);

        // 返回UserPageDTO 用户在“我的”页面要展示的信息
        return Result.ok(userPageDTO);
    }

    /**
     * 单词上限统计
     *
     * @return UserVocBoundStatisticsDTO 用户单词上限统计数据
     */
    @Operation(summary = "获取用户单词上限统计数据", description = "返回用户单词上限统计、已规划使用等数据")
    @GetMapping("/voc/bound/statistics")
    public Result<UserVocBoundStatisticsDTO> getUserVocBoundStatistics() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        UserVocBoundStatisticsDTO userVocBoundStatistics = userService.getUserVocBoundStatistics(userId);

        // 返回UserVocBoundStatisticsDTO 用户单词上限统计数据
        return Result.ok(userVocBoundStatistics);
    }

    /**
     * 单词上限变化明细（分页）
     *
     * @param pageRequest 分页查询请求体
     * @return PageDTO<DisplayUserVocBoundLogDTO> 用户单词上限变化明细分页结果
     */
    @Operation(summary = "获取用户单词上限变化明细", description = "分页返回用户单词上限变化日志")
    @GetMapping("/voc/bound/detail")
    public Result<PageDTO<DisplayUserVocBoundLogDTO>> getUserVocBoundLog(PageRequest pageRequest) {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        PageDTO<DisplayUserVocBoundLogDTO> pageDTO = userService.getUserVocBoundLog(pageRequest, userId);

        // 返回DisplayUserVocBoundLogDTO 用户单词上限变化明细 的分页结果
        return Result.ok(pageDTO);
    }

    /**
     * 我的页面-升级信息
     *
     * @return NextLevelDTO 用户升级信息
     */
    @Operation(summary = "获取用户升级信息", description = "返回距离下次升级剩余天数等信息")
    @GetMapping("/upgrade/info")
    public Result<NextLevelDTO> getUserUpgradeInfo() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        NextLevelDTO nextLevelDTO = userService.getUserNextDTO(userId);

        // 返回NextLevelDTO 用户升级信息
        return Result.ok(nextLevelDTO);
    }

    /**
     * 我的页面-等级信息
     *
     * @return DisplayUserLevelDTO 用户等级信息
     */
    @Operation(summary = "获取用户等级信息", description = "返回等级页面展示的等级信息，包括当前等级和未达等级")
    @GetMapping("/level/info")
    public Result<DisplayUserLevelDTO> getUserLevelInfo() {
        // 获取当前登录用户的ID
        Long userId = StpKit.USER.getLoginIdAsLong();

        // 调用Service层
        DisplayUserLevelDTO displayUserLevelDTO = userService.getUserLevelInfo(userId);

        // 返回DisplayUserLevelDTO 用户等级信息
        return Result.ok(displayUserLevelDTO);
    }
}
